import tkinter as tk
from tkinter import ttk, filedialog
import os
from xmind2excel import parse_xmind_to_excel
from excel2xmind import create_xmind_from_excel
import tkinter.font as tkfont
from datetime import datetime


def select_file(entry, output_entry, filetypes, default_ext):
    """
    用于选择输入文件，并根据所选文件生成默认的输出文件名
    Args:
        entry (tk.Entry): 输入文件路径的输入框对象
        output_entry (tk.Entry): 输出文件名的输入框对象
        filetypes (list): 允许选择的文件类型列表，
                            例如 [("XMind files", "*.xmind")],
                                 [("Excel files", "*.xlsx;*.xls")]
        default_ext (str): 输出文件的默认扩展名，如 .xlsx 或 .xmind
    """
    file_path = filedialog.askopenfilename(filetypes=filetypes)
    entry.delete(0, tk.END)
    entry.insert(0, file_path)
    if file_path:
        file_name = os.path.splitext(os.path.basename(file_path))[0]
        default_name = f"{file_name}_output{default_ext}"
        output_entry.delete(0, tk.END)
        output_entry.insert(0, default_name)


def select_directory(entry):
    """
    用于选择输出文件的目录

    Args:
        entry (tk.Entry): 输出目录的输入框对象
    """
    dir_path = filedialog.askdirectory()
    if dir_path:
        entry.delete(0, tk.END)
        entry.insert(0, dir_path)


def convert_file(input_file_entry, output_dir_entry, output_name_entry, convert_func):
    """
    执行文件转换操作，并将转换结果显示在状态文本框中

    Args:
        input_file_entry (tk.Entry): 输入文件路径的输入框对象
        output_dir_entry (tk.Entry): 输出目录的输入框对象
        output_name_entry (tk.Entry): 输出文件名的输入框对象
        convert_func (func): 实际的转换函数，如 parse_xmind_to_excel 或 create_xmind_from_excel
    """
    input_file = input_file_entry.get()
    output_dir = output_dir_entry.get()
    output_name = output_name_entry.get()
    if not output_dir:
        output_dir = os.getcwd()
    output_file = os.path.join(output_dir, output_name)
    if input_file and output_file:
        result = convert_func(input_file, output_file)
        add_status_info(result)
    else:
        add_status_info("请选择输入文件和指定输出文件！")


def create_labeled_entry(parent, label_text, style, default_text="", **kw):
    label = ttk.Label(parent, text=label_text, **kw)
    label.pack(pady=5)
    entry = ttk.Entry(parent, width=50, style=style, **kw)
    if default_text:
        entry.insert(0, default_text)
    entry.pack(pady=5)
    return entry


def create_button(parent, text, command, **kw):
    button = ttk.Button(parent, text=text, command=command, **kw)
    button.pack(pady=5)
    return button


def add_status_info(info):
    """
    添加状态信息，并显示当前时间
    """
    global status_text
    current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    status_text.insert(tk.END, f"【{current_time}】{info}\n")
    status_text.see(tk.END)


def create_tab(notebook, tab_text, input_label_text, input_filetypes, input_default_ext, output_label_text, convert_func):
    """
    创建一个选项卡，并添加相应的组件，包括输入文件选择、输出目录选择、输出文件名输入和转换按钮

    Args:
        notebook (_type_): 选项卡容器对象
        tab_text (str): 选项卡的文本标签，如 “XMind 转 Excel”
        input_label_text (str): 输入文件的标签文本，如 “选择 XMind 文件:”
        input_filetypes (list): 允许选择的输入文件类型列表
        input_default_ext (str): 输出文件的默认扩展名
        output_label_text (str): 输出文件的标签文本，如 “Excel 文件”
        convert_func (func): 实际的转换函数

    Returns:
        _type_: 返回输入文件路径、输出目录和输出文件名的输入框对象
    """
    # 创建样式对象
    style = ttk.Style()
    style.theme_use('clam')
    style.configure("confirm.TButton", foreground="#A0522D", font=("Microsoft YaHei", 11, 'bold'))
    style.map("confirm.TButton", focuscolor=[('focus', 'systemTransparent')])
    style.map("choose.TButton", focuscolor=[('focus', 'systemTransparent')])
    style.configure("TNotebook.Tab", font=("Microsoft YaHei", 9, "bold"))

    # 创建tab对象
    tab = ttk.Frame(notebook)
    notebook.add(tab, text=tab_text)

    input_entry = create_labeled_entry(tab, input_label_text, 'Custom.TEntry')
    create_button(tab, "选择输入文件", lambda: select_file(input_entry, output_name_entry, input_filetypes, input_default_ext), style="choose.TButton")

    output_dir_entry = create_labeled_entry(tab, f"输出 {output_label_text} 目录:", 'Custom.TEntry', default_text=os.getcwd())
    create_button(tab, "选择输出目录", lambda: select_directory(output_dir_entry), style="choose.TButton")

    output_name_entry = create_labeled_entry(tab, f"输出 {output_label_text} 文件名:", 'Custom.TEntry', default_text=f"output{input_default_ext}")

    create_button(tab, tab_text, lambda: convert_file(input_entry, output_dir_entry, output_name_entry, convert_func), style="confirm.TButton")

    return input_entry, output_dir_entry, output_name_entry


# 创建主窗口
root = tk.Tk()
root.title("XMind 与 Excel 转换工具")

# 创建 Notebook 用于管理选项卡
notebook = ttk.Notebook(root)

# 创建 XMind 转 Excel 选项卡
create_tab(notebook, "XMind 转 Excel", "选择 XMind 文件:", [("XMind files", "*.xmind")], ".xlsx", "Excel 文件", parse_xmind_to_excel)

# 创建 Excel 转 XMind 选项卡
create_tab(notebook, "Excel 转 XMind", "选择 Excel 文件:", [("Excel files", "*.xlsx;*.xls")], ".xmind", "XMind 文件", create_xmind_from_excel)

notebook.pack(pady=10, padx=10, fill=tk.BOTH, expand=True)

# 创建清空按钮并放在文本框上方
clear_button = tk.Button(root, text="清空文本框", font=tkfont.Font(family='Microsoft YaHei', size=8), command=lambda: clear_text())
clear_button.pack(pady=1)

# 用于显示状态信息的文本框
status_text = tk.Text(root, height=10, width=55, font=tkfont.Font(family='Microsoft YaHei', size=9))
status_text.pack(side=tk.LEFT, pady=10, fill=tk.Y)

# 创建垂直滚动条并关联到文本框
scrollbar = tk.Scrollbar(root, command=status_text.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
status_text.config(yscrollcommand=scrollbar.set)

# 定义清空文本框的函数
def clear_text():
    global status_text
    status_text.delete(1.0, tk.END)


# 运行主循环
root.mainloop()